package com.qf.controller;

import com.qf.dao.UserDaoImpl;
import com.qf.pojo.User;
import com.qf.service.UserService;
import com.qf.service.UserServiceImpl;
import com.qf.utils.Constants;
import com.qf.utils.StrUtils;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

/**
 * @author 汤奇
 * @version V1.0
 * @Project BookPro
 * @Package com.qf.controller
 * @Description: 消费者Controller, 控制层
 * @Date 2022/5/23 21:11
 */
@WebServlet("/user")
public class UserController extends BaseServlet {
    UserService userService = new UserServiceImpl(new UserDaoImpl());

    /**
     * 用户注册, 校验用户名是否可用
     */
    public void check(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1.接收注册页传过来的数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //2.调用service,判断用户名是否存在,如果存在,那么这个用户名不可用,如果不存在,用户名可用
        boolean result = userService.check(username);
        //3.将是否可用信息返回给页面展示
        if (result){
            //用户名可用
            response.getWriter().write(Constants.NOT_HAS_USER);
        } else {
            //用户名不可用
            response.getWriter().write(Constants.HAS_USER);
        }
    }

    /**
     * 消费者用户登录
     */
    public String login(HttpServletRequest request, HttpServletResponse response) {
        //1.获取用户名
        String username = request.getParameter("username");
        //2.获取密码
        String password = request.getParameter("password");
        //3.获取验证码
        String code = request.getParameter("code");
        //4.获取用户是否要自动登录参数
        String auto = request.getParameter("auto");
        //5.判断用户名 密码 验证码是否为空,为空重定向到登录页
        if (!StrUtils.empty(username, password, code)) {
            request.setAttribute("msg", "用户名,密码或者验证码不能为空");
            //跳转到登录页
            return "forward:/login.jsp";
        }
        //6.校验验证码是否正确, 不正确重定向到登录页
        //从session中获取保存的验证码
        String codeSession = (String) request.getSession().getAttribute("code");
        if (!code.equalsIgnoreCase(codeSession)) {
            request.setAttribute("username", username);
            request.setAttribute("password", password);
            request.setAttribute("msg", "验证码不正确");
            //跳转到登录页
            return "forward:/login.jsp";
        }
        //7.调用service完成用户名密码的校验

        User user = userService.login(username, password);
        //8.判断用户名 密码是否正确, 如果错误返回提示信息
        if (user == null) {
            request.setAttribute("username", username);
            request.setAttribute("password", password);
            request.setAttribute("msg", "用户名或者密码不正确");
            //跳转到登录页
            return "forward:/login.jsp";
        }
        //9.登录成功,将用户信息放入session会话当中携带
        request.getSession().setAttribute("loginUser", user);
        //10.判断用户是否要自动登录, 进行自动登录设置
        if ("on".equals(auto)) {
            Cookie cookie = new Cookie(Constants.AUTO_NAME, user.getUsername());
            //设置这个Cookie的保存路径
            cookie.setPath("/");
            //设置Cookie保存数据的时间
            cookie.setMaxAge(60 * 60 * 24 * 14);
            //通过响应将Cookie数据写回到浏览器中保存
            response.addCookie(cookie);
        }
        //11.跳转到首页
        return "redirect:/goods?method=index";
    }

    /**
     * 消费者新用户注册
     * */
    public String register(HttpServletRequest request, HttpServletResponse response) throws InvocationTargetException, IllegalAccessException {
        //1.获取页面传入的所有参数,key就是页面input框的name属性,value就是input框中输入的值
        Map<String, String[]> parameterMap = request.getParameterMap();

        //2.将参数封装成User对象
        //创建用户对象
        User user = new User();

        //利用beanUtils工具类,将map中的数据全部自动set到user对象中
        //使用要求:user对象的属性名必须和页面input框的name属性一致,实体类必须实现Serializable序列化接口
        BeanUtils.populate(user,parameterMap);

        //3.调用service, 将用户对象保存到mysql数据库的用户表中
        int count = userService.createUser(user);

        //4.跳转到注册成功页面
        if (count > 0){
            //注册成功
            return "redirect:/registerSuccess.jsp";
        } else {
            //注册失败
            return "redirect:/register.jsp";
        }
    }
}
